// 接口的作用：在面向对象的编程中，接口是一种规范的定义，
// 它定义了行为和动作的规范，在程序设计里面，接口起到一种限制和规范的作用。
// 接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里面方法的实现细节,
// 他只规定这批类里面必须提供某些方法,提供这些方法的类就可以满足实际需要.
// ts中的接口类似于java,同时还增加了更灵活的接口类型,包括属性,函数,可索引和类

// 1.属性类接口  对json的约束
// 接口 :行为和动作规范,对批量方法进行约束
// interface FullName{
//   age:number,
//   name:string
// }

// function userInfos(info:FullName){
// console.log( info.age + info.name);
// }
// // 传入的参数必须包含 age name
// let obj ={
//   age:20,
//   name:'小花'
// }
// userInfos(obj)

// 案例
// $.ajax({
//   type:'GET',
//   url:'tsts.json',
//   data:{username:$('#username').val(),content:$('#content').val()},
//   dataType:'json'
// })

// interface Config{
//   type:string,
//   url:string,
//   data?:string,
//   dataType:string
// }

// function ajax(config:Config){
//   let xhr =new XMLHttpRequest()
//   xhr.open(config.type,config.url,true)
//   xhr.send(config.data)
//   xhr.onreadystatechange = function(){
//     if(xhr.readyState ==4 && xhr.status ==200){
//       console.log('成功');
//     }
//   }
// }
// ajax({
//   type:'get',
//   url:'http:www.baidu.com',
//   dataType:'json'
// })

//接口 可选属性
// interface FullName{
//   age?:number,
//   name:string
// }

// function userInfos(info:FullName){
// console.log( info.age + info.name);
// }
// // 传入的参数必须包含 age name
// let obj ={
//   name:'小花'
// }
// userInfos(obj)

// 2.函数类型接口  对方法传入的参数 以及返回值进行约束

// 加密的函数类型接口

// interface encypt{
//   (key:string,value:string):string
// }

// let md5:encypt=function(key:string,value:string):string{
//   return key +value
// }
// console.log(md5('姓名','小花'))
// 3.可索引接口  数组、对象的约束（不常用）
// interface UserArr{
//   [index:number]:string
// }
// let arr9:UserArr =['123']
// 4.类类型接口 implements  对类的约束 和抽象类有点相似 （常用）

// interface Animal{
//   name:string;
//   eat(str:string):void
// }

// class Dog implements Animal{
//   name:string;
//   constructor(name:string){
//     this.name =name
//   }
//   eat(){
//     console.log(this.name + '爱吃肉');
//   }
// }

// let d= new Dog('小狗')

// class Cat implements Animal{
//   name:string;
//   constructor(name:string){
//     this.name =name
//   }
//   eat(food:string){
//     console.log(this.name + food);
//   }
// }

// let c= new Cat('小狗')
// c.eat('爱吃鱼')
// 5.接口扩展  接口可以继承接口

// interface Animal{
//   eat():void
// }

// interface Person extends Animal{
//   work():void
// }

// class Web implements Person{
//   name:string;
//   constructor(name:string){
//     this.name =name
//   }
//   eat(){
//     console.log(this.name+'爱吃肉');
//   }
//   work(){
//     console.log(this.name+'爱学习');
//   }
// }

// let w= new Web('小花')
// w.eat()
// w.work()

interface Person {
  id: number
  name: string
  [propName: string]: any
}
let p1 = {
  id: 1,
  name: '小花',
  age: 10,
}
